﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data;
using produccion.reportes;


namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FRMinfEntSal.xaml
    /// </summary>
    public partial class FRMinfEntSal : Window
    {
        DataTable DtConsulta;//FJRF - Para el manejo de las consultas genericas
        DataSet DsConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
        String StrConsulta;//FJRF - Para el manejo de la creacion de los string de consulta generica
        MDOgeneral MdoGeneral = new MDOgeneral();//FJRF - Para traer las funciones de mdo general

        public FRMinfEntSal()
        {
            InitializeComponent();
        }

        private void butSal_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void Window_Closed(object sender, EventArgs e)
        {
            infEntSal.Instance = null;
        }

        private void butImp2_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                DataSet ds = new DataSet("dsEntSal");
                DataTable encabezado = new DataTable("encabezado");
                encabezado.Columns.Add("desde", System.Type.GetType("System.String"));
                encabezado.Columns.Add("hasta", System.Type.GetType("System.String"));
                encabezado.Columns.Add("material", System.Type.GetType("System.String"));
                encabezado.Columns.Add("proveedor", System.Type.GetType("System.String"));
                encabezado.Columns.Add("grupo", System.Type.GetType("System.String"));
                encabezado.Columns.Add("subgrupo", System.Type.GetType("System.String"));
                encabezado.Columns.Add("STREMPRESA", System.Type.GetType("System.String"));
                DataRow r = encabezado.NewRow();
                r["desde"] = datDesde.Text;
                r["hasta"] = datHasta.Text;
                r["material"] = txtMaterial.Text;
                r["proveedor"] = combProv.Text;
                r["grupo"] = combGru.Text;
                r["subgrupo"] = combSubg.Text;
                r["STREMPRESA"] = MDOgeneral.strEmpresaImprime;
                encabezado.Rows.Add(r);
                ds.Tables.Add(encabezado);
                ds.Tables.Add(infEntSal.Instance.repMat.Copy());
                ds.Tables.Add(infEntSal.Instance.repGru.Copy());
                Vista vista = new Vista { ds = ds, reporte = @"reportes\repEntSal2.rpt" };
                vista.Show();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void butProcesar_Click(object sender, RoutedEventArgs e)
        {
            String StrCodigoColor;//FJRF - Variable que contendra el codigo del color
            if (CboColorCodigo.SelectedValue == null)//FJRF - Si no tiene colores hacemos lo siguiente
            {
                StrCodigoColor = "ZZZZ";//FJRF - Enviamos 4 Z
            }
            else//FJRF - Si si tiene colores hacemos lo siguiente
            {
                StrCodigoColor = CboColorCodigo.SelectedValue.ToString();//FJRF - Asignamos el codigo del color
            }
            infEntSal.Instance.RepEntrSal(StrCodigoColor);//FJRF - Le enviamos por medio de la instancia el codigo del color
        }

        private void butImp1_Click(object sender, RoutedEventArgs e)
        {
            try 
            {
                DataSet ds = new DataSet("dsEntSal");
                DataTable encabezado = new DataTable("encabezado");
                encabezado.Columns.Add("desde", System.Type.GetType("System.String"));
                encabezado.Columns.Add("hasta", System.Type.GetType("System.String"));
                encabezado.Columns.Add("material", System.Type.GetType("System.String"));
                encabezado.Columns.Add("proveedor", System.Type.GetType("System.String"));
                encabezado.Columns.Add("grupo", System.Type.GetType("System.String"));
                encabezado.Columns.Add("subgrupo", System.Type.GetType("System.String"));
                encabezado.Columns.Add("STREMPRESA", System.Type.GetType("System.String")); //FJRF - Se agrega la columna que maneja el nombre de la empresa

                DataRow r = encabezado.NewRow();
                r["desde"]=datDesde.Text;
                r["hasta"]=datHasta.Text;
                r["material"]=txtMaterial.Text;
                r["proveedor"]=combProv.Text;
                r["grupo"]=combGru.Text;
                r["subgrupo"] = combSubg.Text;
                r["STREMPRESA"] = MDOgeneral.strEmpresaImprime;//FJRF - Se asigna el nombre de la empresa

                encabezado.Rows.Add(r);
                ds.Tables.Add(encabezado);
                ds.Tables.Add(infEntSal.Instance.repMat.Copy());
                ds.Tables.Add(infEntSal.Instance.repGru.Copy());
                Vista vista = new Vista { ds = ds, reporte = @"reportes\repEntSal1.rpt" };
                vista.Show();            
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void datMat_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            try 
            {
                if (datMat.CurrentColumn != null)
                {
                    infEntSal.Instance.tipo = datMat.CurrentColumn.Header.ToString();

                    switch (datMat.CurrentColumn.Header.ToString())
                    {
                        case "Normal":
                            infEntSal.Instance.RepDetEntrSal("EN");
                            break;
                        case "Devolu":
                            infEntSal.Instance.RepDetEntrSal("ED");
                            break;
                        case "Muestr":
                            infEntSal.Instance.RepDetEntrSal("EM");
                            break;
                        case "Ajuste":
                            infEntSal.Instance.RepDetEntrSal("EA");
                            break;
                        case "Otro":
                            infEntSal.Instance.RepDetEntrSal("EO");
                            break;
                        case "Cliente":
                            infEntSal.Instance.RepDetEntrSal("SC");
                            break;
                        case "Taller":
                            infEntSal.Instance.RepDetEntrSal("ST");
                            break;
                        case "Produ":
                            infEntSal.Instance.RepDetEntrSal("SP");
                            break;
                        case "S/Devo":
                            infEntSal.Instance.RepDetEntrSal("SD");
                            break;
                        case "S/Ajus":
                            infEntSal.Instance.RepDetEntrSal("SA");
                            break;
                        case "S/Otro":
                            infEntSal.Instance.RepDetEntrSal("SO");
                            break;
                        default:
                            break;
                    }
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            Keyboard.Focus(txtMaterial);
        }

        private void datMat_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter && elemento != null)
            {
                e.Handled = true;
                elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.F3 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta == true) { MDOgeneral.logBusquedadAbierta = false; }
            }

            if (e.Key == Key.F4 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta1 == true) { MDOgeneral.logBusquedadAbierta1 = false; }
            }

            if (e.Key == Key.F5 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta2 == true) { MDOgeneral.logBusquedadAbierta2 = false; }
            }
        }

        private void txbNombreMat_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (txtMaterial.Text.Length == 6)
            {
 
            }
        }

        private void txtMaterial_TextChanged(object sender, TextChangedEventArgs e)
        {
            StrConsulta = "SELECT ";
            StrConsulta = StrConsulta + "CodMat_Mtp, CodCol_Mtp, NomCol_Col ";
            StrConsulta = StrConsulta + "FROM maemtp, maecolp ";
            StrConsulta = StrConsulta + "WHERE maemtp.CodCol_Mtp = maecolp.CodCol_Col ";
            StrConsulta = StrConsulta + "AND CodMat_Mtp = '" + txtMaterial.Text + "' ";
            StrConsulta = StrConsulta + "ORDER BY NomCol_Col ";
            CargarComboColores(CboColorCodigo, StrConsulta, "CODCOL_MTP", "CODCOL_MTP", "Codigo");
            CargarComboColores(CboColorNombre, StrConsulta, "CODCOL_MTP", "NOMCOL_COL", "Nombre");
        }
        //FJRF - Con esta funcion cargamos los combos (Cargar combos de los colores)
        private Boolean CargarComboColores(ComboBox CboComboACargar, string strConsultaOracle, string strSelectedValuePath, string strDisplayMemberPath, string strCodigoNombre)
        {
            Boolean BooSiHayDatos = false;//FJRF - Variable para informar si hay datos o no
            CboComboACargar.ItemsSource = null;
            CboComboACargar.Items.Clear();//FJRF - Borramos los posibles datos que pueda tener el combo

            DtConsulta = new DataTable();//FJRF - Inicializamos la variable
            DsConsulta = new DataSet();//FJRF - Inicializamos la variable

            DtConsulta = MdoGeneral.consulta(strConsultaOracle);//FJRF - Realizamos la consulta y retornamos los datos

            if (DtConsulta.Rows.Count > 0)//FJRF - Si hay datos llenar el combo
            {
                BooSiHayDatos = true;//FJRF - Informamos que hay datos

                DataRow drEncabezado;
                drEncabezado = DtConsulta.NewRow();

                if (strCodigoNombre == "Codigo")
                {
                    drEncabezado[strSelectedValuePath] = "ZZZZ";
                    drEncabezado[strDisplayMemberPath] = "ZZZZ";
                }
                if (strCodigoNombre == "Nombre")
                {
                    drEncabezado[strSelectedValuePath] = "ZZZZ";
                    drEncabezado[strDisplayMemberPath] = "TODOS";
                }

                DtConsulta.Rows.Add(drEncabezado);

                DsConsulta.Tables.Add(DtConsulta);//FJRF - Adicionameos el datatable al dataset
                CboComboACargar.ItemsSource = DsConsulta.Tables[0].DefaultView;//FJRF - Cargamos los datos encontrados
                CboComboACargar.SelectedValuePath = strSelectedValuePath.ToUpper();//FJRF - Cargamos la posicion
                CboComboACargar.DisplayMemberPath = strDisplayMemberPath.ToUpper();//FJRF - Decimos cual dato se mostrara

                CboComboACargar.SelectedValue = "ZZZZ";//FJRF - Ponemos el combo en la primera posicion
            }
            return BooSiHayDatos;//FJRF - Avisamos que si hay o no hay datos
        }
        private void CboColorCodigo_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            CboColorNombre.SelectedIndex = CboColorCodigo.SelectedIndex;
        }
        private void CboColorNombre_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            CboColorCodigo.SelectedIndex = CboColorNombre.SelectedIndex;
        }

        private void DataGridTextColumn_Scroll(object sender, System.Windows.Controls.Primitives.ScrollEventArgs e)
        {

        }

        private void datMat_MouseUp(object sender, MouseButtonEventArgs e)
        {
            try
            {
                if (datMat.CurrentColumn != null)
                {
                    infEntSal.Instance.ExistenciaMesAñoYActual();
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }

        }
        private void datMat_KeyUp(object sender, KeyEventArgs e)
        {
            try
            {
                if (datMat.CurrentColumn != null)
                {
                    infEntSal.Instance.ExistenciaMesAñoYActual();
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
    }


    public class infEntSal:ObservableObject
    {
   
        #region singleton

        private static infEntSal instance = null;

        protected infEntSal()
        {
            //_matles = new clases.CLSMAEMAT().LisMateriales();
            MDOgeneral.conectar();
            strTituloVentana = "Reporte de entradas y salidas - Usuario: " + MDOgeneral.usuario + " - [FRMinfEntSal]";
        }

        RelayCommand _cmdBuscarMaterial;
        public ICommand cmdBuscarMaterial 
        {
            get
            {
                if (_cmdBuscarMaterial == null)
                {
                    _cmdBuscarMaterial = new RelayCommand(r => BuscarMaterial());
                }
                return _cmdBuscarMaterial;
            }
        }

        public void BuscarMaterial()
        {
            FRMBuscarCol frm = new FRMBuscarCol();
            frm.RequiereColor = false;
            frm.EsReferencia = false;                        
            frm.ShowDialog();
            if (!String.IsNullOrEmpty(frm.Retorno))
            {
                material = frm.Retorno.Substring(0, 6);
                nombreMaterial = frm.Retorno.Substring(7);
            }
        }

        public static infEntSal Instance
        {
            get 
            {
                if (instance == null)
                    instance = new infEntSal();
               return instance;
             }
            set 
            { 
                if (instance != null)
                    instance = null;
            }
       }

        #endregion

        private string _strTituloVentana;
        public string strTituloVentana
        {
            get { return _strTituloVentana; }
            set { _strTituloVentana = value; RaisePropertyChangedEvent("strTituloVentana"); }
        }

        List<clases.CLSMAEPRVP> _lisPrvDor = new clases.CLSMAEPRVP().listaProv();
        public List<clases.CLSMAEPRVP> lisPrvDor
        {
            get {return _lisPrvDor;}
            set {_lisPrvDor = value; RaisePropertyChangedEvent("lisPrvDor"); }
        }

        List<clases.CLSMAEGRP> _grupos = new clases.CLSMAEGRP().listaGrupos();
        public List<clases.CLSMAEGRP> grupos
        {
            get { return _grupos; } 
            set { _grupos = value; RaisePropertyChangedEvent("grupos"); }
        }

        List<clases.CLSMAESUB> _subgrupos = new List<clases.CLSMAESUB>();
        public List<clases.CLSMAESUB> subgrupos
        {
            get { return _subgrupos; }
            set { _subgrupos = value; RaisePropertyChangedEvent("subgrupos"); }
        }

        List<clases.CLSMAEMAT> _matles;
        public List<clases.CLSMAEMAT> matles
        {
            get { return _matles; }
            set { _matles = value; RaisePropertyChangedEvent("matles"); }
        }
 
        string _codprv;
        public string codprv 
        {
            get { return _codprv; }
            set { _codprv = value; RaisePropertyChangedEvent("codprv"); }
        }

        string _codgru;
        public string codgru 
        {
            get { return _codgru; }
            set 
            { 
                _codgru = value; 
                consSubg(); 
                RaisePropertyChangedEvent("codgru");
            }
        }

        string _codsub;
        public string codsub
        {
            get { return _codsub; }
            set { _codsub = value;  RaisePropertyChangedEvent("codsub"); }
        }

        public void consSubg() 
        {
            try 
            {
                clases.CLSMAESUB subg = new clases.CLSMAESUB {CODGRP_SUB=codgru};
                subgrupos=subg.listaSubg();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
        
        DataTable _repMat = new DataTable();
        public DataTable repMat 
        {
            get { return _repMat; }
            set { _repMat = value; RaisePropertyChangedEvent("repMat"); }
        }

        DataTable _repGru = new DataTable();
        public DataTable repGru
        {
            get { return _repGru; }
            set
            { _repGru = value; RaisePropertyChangedEvent("repGru"); }
        }

        DateTime _desde = DateTime.Today.AddMonths(-1);
        public DateTime desde 
        {
            get { return _desde; }
            set { _desde = value; RaisePropertyChangedEvent("desde"); }
        }

        DateTime _hasta = DateTime.Today;
        public DateTime hasta
        {
            get { return _hasta; }
            set { _hasta = value; RaisePropertyChangedEvent("hasta"); }
        }

        string _codmat;
        public string codmat 
        {
            get { return _codmat; }
            set { _codmat = value; RaisePropertyChangedEvent("codmat"); }

        }

        private string _strTipo;
        public string strTipo
        {
            get { return _strTipo; }
            set { _strTipo = value; RaisePropertyChangedEvent("strTipo"); }
        }

        public void RepEntrSal(String StrCodigoColorSeleccionado) 
        {
            try 
            {
                Mouse.OverrideCursor = Cursors.Wait;

                String StrCodigoColorInicial, StrCodigoColorFinal;
                if (!String.IsNullOrEmpty(material))
                {
                    codmat = material.Substring(0, 6);

                    if (StrCodigoColorSeleccionado == "ZZZZ")//FJRF - Si no tiene colores asignados lo enviamos con todos
                    {
                        StrCodigoColorInicial = "    ";//FJRF - Enviamos 4 espacios en blanco para el inicio
                        StrCodigoColorFinal = "ZZZZ";//FJRF - Enviamos 4 Z para el final
                    }
                    else//FJRF - Si tiene colores le enviamos el mismo color al inicio y al final
                    {
                        StrCodigoColorInicial = StrCodigoColorSeleccionado;//FJRF - Extraemos el codigo del color para la posicion inicial
                        StrCodigoColorFinal = StrCodigoColorSeleccionado;//FJRF - Extraemos el codigo del color para la posicion final
                    }
                }
                else
                {
                    codmat = null;

                    StrCodigoColorInicial = "    ";//FJRF - Enviamos 4 espacios en blanco para el inicio
                    StrCodigoColorFinal = "ZZZZ";//FJRF - Enviamos 4 Z para el final
                }

                clases.CLSMAEMAT mat = new clases.CLSMAEMAT();
                mat.RepEntrSal(desde, hasta, codprv, codgru, codsub, codmat, StrCodigoColorInicial, StrCodigoColorFinal);
                repMat = mat.repMat;
                repMat.TableName="tmpentsal1";           
                repGru = mat.repGru;
                repGru.TableName = "tmpentsal2";

                Mouse.OverrideCursor = Cursors.Arrow;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }  
        }

        private DataTable _detCan=new DataTable();
        public DataTable detCan 
        {
            get { return _detCan; }
            set { _detCan = value; RaisePropertyChangedEvent("detCan"); }
        }

        private int _SelDetCan;
        public int SelDetCan
        {
            get { return _SelDetCan; }
            set { _SelDetCan = value; RaisePropertyChangedEvent("SelDetCan"); }
        }

        private int _SelRepMat;
        public int SelRepMat 
        {
            get { return _SelRepMat; }
            set { _SelRepMat = value; RaisePropertyChangedEvent("SelRepMat"); }
        }

        private string _material;
        public string material 
        {
            get { return _material; }
            set 
            {  
                _material = value;
                if (_material.Length == 6)
                {
                    clases.CLSMAEMAT objmat = new clases.CLSMAEMAT { CODMAT_MAT = _material };
                    objmat.Consultar();
                    if (!String.IsNullOrEmpty(objmat.NOMMAT_MAT))
                    {
                        nombreMaterial = objmat.NOMMAT_MAT;
                        _material = objmat.CODMAT_MAT;
                    }
                    else
                        nombreMaterial = "Material no existe";
                }
                else
                    nombreMaterial = "";
                RaisePropertyChangedEvent("material");
            }
        }

        private string _nombreColor;
        public string nombreColor
        {
            get { return _nombreColor; }
            set { _nombreColor = value; RaisePropertyChangedEvent("nombreColor"); }
        }

        private string _nombreMaterial;
        public string nombreMaterial
        {
            get { return _nombreMaterial; }
            set { _nombreMaterial = value; RaisePropertyChangedEvent("nombreMaterial"); }
        }

        private string _color;
        public string color 
        {
            get { return _color; }
            set { _color = value; RaisePropertyChangedEvent("color"); }
        }

        private string _tipo;
        public string tipo 
        {
            get { return _tipo; }
            set { _tipo = value; RaisePropertyChangedEvent("tipo"); }
        }

        #region FJRF - Variables para existencias
        private string _INIMES_TMP;
        public string INIMES_TMP
        {
            get { return _INIMES_TMP; }
            set { _INIMES_TMP = value; RaisePropertyChangedEvent("INIMES_TMP"); }
        }
        private string _INIANO_TMP;
        public string INIANO_TMP
        {
            get { return _INIANO_TMP; }
            set { _INIANO_TMP = value; RaisePropertyChangedEvent("INIANO_TMP"); }
        }
        private string _EXIACT_TMP;
        public string EXIACT_TMP
        {
            get { return _EXIACT_TMP; }
            set { _EXIACT_TMP = value; RaisePropertyChangedEvent("EXIACT_TMP"); }
        }
        private string _ReferenciaSeleccionada;
        public string ReferenciaSeleccionada
        {
            get { return _ReferenciaSeleccionada; }
            set { _ReferenciaSeleccionada = value; RaisePropertyChangedEvent("ReferenciaSeleccionada"); }
        }

        public void ExistenciaMesAñoYActual()
        {
            try
            {
                ReferenciaSeleccionada = repMat.Rows[SelRepMat]["CODMAT_TMP"].ToString() + " - " + repMat.Rows[SelRepMat]["NOMMAT_TMP"].ToString() + " - " + repMat.Rows[SelRepMat]["NOMCOL_TMP"].ToString();//FJRF - Cargamos los datos con este campo
                INIMES_TMP = repMat.Rows[SelRepMat]["INIMES_TMP"].ToString();//FJRF - Cargamos los datos con este campo
                INIANO_TMP = repMat.Rows[SelRepMat]["INIANO_TMP"].ToString();//FJRF - Cargamos los datos con este campo
                EXIACT_TMP = repMat.Rows[SelRepMat]["EXIACT_TMP"].ToString();//FJRF - Cargamos los datos con este campo
            }
            catch (Exception ex)//FJRF - Si se presenta un error limpiamos los datos
            {
                ReferenciaSeleccionada = "";//FJRF - Limpiamos los datos
                INIMES_TMP = "";//FJRF - Limpiamos los datos
                INIANO_TMP = "";//FJRF - Limpiamos los datos
                EXIACT_TMP = "";//FJRF - Limpiamos los datos

                MessageBox.Show(ex.Message);
            }
        }
        #endregion

        public void RepDetEntrSal(string tipo)
        {
            try 
            {
                strTipo = tipo;
                clases.CLSMAEMAT mat = new clases.CLSMAEMAT();
                color = repMat.Rows[SelRepMat]["CODCOL_TMP"].ToString();
                nombreColor = repMat.Rows[SelRepMat]["NOMCOL_TMP"].ToString();
                material = repMat.Rows[SelRepMat]["CODMAT_TMP"].ToString();
                nombreMaterial = repMat.Rows[SelRepMat]["NOMMAT_TMP"].ToString();
                mat.RepDetEntrSal(desde, hasta, material, color,tipo);
                detCan = mat.repDetMat;
                repMat.TableName = "tmpdetentsal";
                FRMdetCanEntSal frm = new FRMdetCanEntSal();
                frm.ShowDialog();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message);}
        }
    }



}
